package de.e2it3t.schulverwaltung.ui;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.e2it3t.schulverwaltung.App;
import de.e2it3t.schulverwaltung.data.KlassenTable;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

/**
 * Ansicht der Klassen.
 * 
 * @author Markus Kunz
 */
public class KlasseView extends JPanel implements AppView {
    
    
    private JTable klassenTable;
    private JButton addButton;
    private JButton editButton;
    private JButton deleteButton;
    
    private List<KlassenTable> klassenData;
    
    
    public KlasseView() {
        setupKlassenTable();
        setupAddButton();
        setupDeleteButton();
        setupEditButton();
        
        setLayout(new FormLayout(
                "fill:pref:grow, pref, 5px, pref, 5px, pref, 5px, pref",
                "pref, 5px, fill:pref:grow"));
        CellConstraints cc = new CellConstraints();
        
        add(addButton, cc.xy(2, 1));
        add(editButton, cc.xy(4, 1));
        add(deleteButton, cc.xy(6, 1));
        add(App.createInfoButton("<html>Die Klassenansicht listet alle vorhandenen Klassen. "
                + "Man kann Klassen hinzugefügen, bearbeiten oder löschen.<br><br>"
                + "Die Lehrer sind fest in der Datenbank hinterlegt und können bisher "
                + "nicht mit dieser Anwendung bearbeitet werden.", 330, 130), cc.xy(8, 1));
        add(new JScrollPane(klassenTable), cc.xywh(1, 3, 8, 1));
    }
    
    private void setupKlassenTable() {
        klassenTable = new JTable();
        // Liste soll den kompletten, zur Verfügung stehenden Platz nutzen
        klassenTable.setFillsViewportHeight(true);
        // Hack: wir brauchen eine gewünschte Größe, damit die Liste
        // gescrollt werden kann, wenn sie zu viele Einträge hat
        klassenTable.setPreferredScrollableViewportSize(new Dimension(50, 50));
        // wir wollen die Liste durch Klick auf die Header sortieren können
        klassenTable.setAutoCreateRowSorter(true);
        klassenTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // Buttons ensprechend der Selektion de-/aktivieren
                deleteButton.setEnabled(klassenTable.getSelectedRowCount() != 0);
                editButton.setEnabled(klassenTable.getSelectedRowCount() == 1);
                
                // Doppelklick
                if (e.getClickCount() == 2) {
                    editSelectedKlasse();
                }
            }
        });
    }

    private void setupAddButton() {
        addButton = new JButton("Hinzufügen");
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                // Neuer Schüler
                new KlassenDialog(KlasseView.this).setVisible(true);
            }
        });
    }
    
    private void setupDeleteButton() {
        deleteButton = new JButton("Löschen");
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                deleteSelectedKlasse();
            }
        });
    }
    
    private void setupEditButton() {
        editButton = new JButton("Bearbeiten");
        editButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                editSelectedKlasse();
            }
        });
    }
    
    
    /**
     * Selektierte Klasse bearbeiten (wenn genau eine selektiert ist).
     */
    private void editSelectedKlasse() {
        if (klassenTable.getSelectedRowCount() != 1) {
            return;
        }
        
        int schuelerId = klassenData.get(
                klassenTable.convertRowIndexToModel(
                klassenTable.getSelectedRow())).getId();

        new KlassenDialog(this, schuelerId).setVisible(true);
    }
    
    /**
     * Selektierte Klasse löschen (wenn welche selektiert sind). <br>
     * <br>
     * Es wird nachgefragt, ob wirklich gelöscht werden soll.
     */
    private void deleteSelectedKlasse() {
        if (klassenTable.getSelectedRowCount() == 0) {
            return;
        }
        
        int klassenCount = klassenTable.getSelectedRowCount();
        int result = JOptionPane.showConfirmDialog(
                null,
                "Wollen sie wirklich "
                + (klassenCount == 1 ? "die gewählte Klasse" : klassenCount + " Klassen")
                + " mit den zugehörigen Schülern sowie Lehreinheiten und Lehrblöcken löschen?",
                "Klasse löschen?",
                JOptionPane.YES_NO_OPTION, 
                JOptionPane.QUESTION_MESSAGE);
                
       if (result == JOptionPane.YES_OPTION) {
            for (int index : klassenTable.getSelectedRows()) {
                DeleteKlasse(klassenData.get(
                        klassenTable.convertRowIndexToModel(index)).getId());
            }
            
            refreshView();
        }
    }
    
     public void DeleteKlasse(int klassenID)
    {
        try {
            App.getDatabase().getConnection()
                    .prepareStatement("delete from schueler where klasse_id = " + klassenID)
                    .executeUpdate();
            App.getDatabase().getConnection().prepareStatement("delete from lehreinheit where klasse_id = " + klassenID).executeUpdate();

            App.getDatabase().getConnection().prepareStatement("delete from lehrblock where klasse_id = " + klassenID).executeUpdate();
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
       
       App.getDatabase().deleteKlasse(klassenID);
    }
    
    @Override
    public void refreshView() {
        editButton.setEnabled(false);
        deleteButton.setEnabled(false);
        
        klassenData = App.getDatabase().getKlassenTable();
        klassenTable.setModel(new KlassenTableModel(klassenData));
        klassenTable.getRowSorter().toggleSortOrder(0);
        
        boolean hasKlassen = App.getDatabase().hasKlassen();
        
        addButton.setEnabled(hasKlassen);
        addButton.setToolTipText(hasKlassen ? null : "Keine Klassen vorhanden");
    }

    @Override
    public JComponent getView() {
        return this;
    }

    @Override
    public String getViewName() {
        return "Klassen";
    }
}

class KlassenTableModel extends AbstractTableModel {

    private List<KlassenTable> mData;
    
    public KlassenTableModel(List<KlassenTable> data) {
        mData = data;
    }
    
    
    @Override
    public int getRowCount() {
        return mData.size();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        KlassenTable klasse = mData.get(rowIndex);
        
        switch(columnIndex) {
            case 0:
                return klasse.getBezeichnung();
            case 1:
                return klasse.getKlassenlehrer();
        }
        
        return null;
    }
    
    @Override
    public boolean isCellEditable(int row, int col) {
        return false;
    }

    @Override
    public String getColumnName(int col) {
        switch(col) {
            case 0:
                return "Bezeichnung";
            case 1:
                return "Klassenlehrer";
        }
        
        return null;
    }
}
